#include "fml_led.h"
/* 使用LED控制的GPIO时 */

/***** 用户需实现 ******/
#ifdef GD32
typedef struct
{
	uint32_t led_port;	 /* led的端口名称 */
	uint16_t led_pin;	 /* led的信号号 */
	uint8_t light_level; /* 点亮LED的电平:0为低电平点亮，1为高电平点亮 */
} GPIO_STR;
#endif
#ifdef STM32
typedef struct
{
	GPIO_TypeDef *led_port; /* led的端口名称 */
	uint16_t led_pin;		/* led的信号号 */
	uint8_t light_level;	/* 点亮LED的电平:0为低电平点亮，1为高电平点亮 */
} GPIO_STR;
#endif
/* LED端口的GPIO和PIN配置 */
/***** 用户需实现 ******/
static const GPIO_STR led_gpio_list[LED_TOTAL_NUM] = {
	{GPIOD, GPIO_PIN_7, 0},

};

/*******************************************************************************
** 函数名称  led_io_init
** 功能说明 ：led端口初始化
** 输入参数 ：无
** 输出参数 ：无
********************************************************************************/
void led_io_init(void)
{
	uint8_t i = 0;

	/* 使能所有LED使用的GPIO时钟 */
	FML_LED_GPIO_CLK_ENABLE();

	/* 初始化GPIO */
	for (i = 0; i < LED_TOTAL_NUM; i++)
	{
		fml_led_gpio_init(led_gpio_list[i].led_port,
						  led_gpio_list[i].led_pin);
		fml_gpio_write_pin(led_gpio_list[i].led_port,
						   led_gpio_list[i].led_pin,
						   FML_GPIO_PIN_RESET);
	}
}

/*******************************************************************************
** 函数名称 Led_on
** 功能说明 ：led打开
** 输入参数 ：ledNum: LED编号，可选参数范围在LED枚举类型LED_NUM的范围内，根据硬件上LED个数来确定
** 输出参数 ：无
********************************************************************************/
void led_on(LedTypedefEnum ledNum)
{
	if (ledNum < LED_TOTAL_NUM)
	{
		if (led_gpio_list[ledNum].light_level == 0)
		{
			fml_gpio_write_pin(led_gpio_list[ledNum].led_port,
							   led_gpio_list[ledNum].led_pin,
							   FML_GPIO_PIN_RESET);
		}
		else
		{
			fml_gpio_write_pin(led_gpio_list[ledNum].led_port,
							   led_gpio_list[ledNum].led_pin,
							   FML_GPIO_PIN_SET);
		}
	}
}

/*******************************************************************************
** 函数名称 Led_off
** 功能说明 ：led关闭
** 输入参数 ：ledNum: LED编号，可选参数范围在LED枚举类型LED_NUM的范围内，根据硬件上LED个数来确定
** 输出参数 ：无
********************************************************************************/
void led_off(LedTypedefEnum ledNum)
{
	if (ledNum < LED_TOTAL_NUM)
	{
		if (led_gpio_list[ledNum].light_level == 0)
		{
			fml_gpio_write_pin(led_gpio_list[ledNum].led_port,
							   led_gpio_list[ledNum].led_pin,
							   FML_GPIO_PIN_SET);
		}
		else
		{
			fml_gpio_write_pin(led_gpio_list[ledNum].led_port,
							   led_gpio_list[ledNum].led_pin,
							   FML_GPIO_PIN_RESET);
		}
	}
}

/*******************************************************************************
** 函数名称 Led_toggle
** 功能说明 ：led状态翻转
** 输入参数 ：ledNum: LED编号，可选参数范围在LED枚举类型LED_NUM的范围内，根据硬件上LED个数来确定
** 输出参数 ：无
********************************************************************************/
void led_toggle(LedTypedefEnum ledNum)
{
	if (ledNum < LED_TOTAL_NUM)
	{
		fml_gpio_toggle_pin(led_gpio_list[ledNum].led_port,
							led_gpio_list[ledNum].led_pin);
	}
}

/*******************************************************************************
** 函数名称 Led_control
** 功能说明 ：led控制
** 输入参数 ： ledNum:led编号
							ledMode：LED控制模式，闪烁/打开/关闭
							flashingIntervalTime：闪烁模式的翻转时间
							systemTime：系统时间
** 输出参数 ：无
********************************************************************************/
void led_control(LedTypedefEnum ledNum, LedModeEnum ledMode, uint32_t flashingIntervalTime, uint32_t systemTime)
{
	static uint32_t led_flashing_time[LED_TOTAL_NUM] = {0};
	switch (ledMode)
	{
	case LED_OPEN:
		led_on(ledNum);
		break;
	case LED_CLOSE:
		led_off(ledNum);
		break;
	case LED_FLASHING:
		if ((uint32_t)(systemTime - led_flashing_time[ledNum]) > flashingIntervalTime)
		{
			led_toggle(ledNum);
			led_flashing_time[ledNum] = systemTime;
		}
		break;
	default:
		break;
	}
}
